home
***
CD-ROM
|
disk
|
FTP
|
other
***
search
/
Deutsche Edition 1
/
Deutsche Edition 1.iso
/
amok
/
amok_lha
/
amok40.lha
/
DoubleBuffering
/
DoubleBuffering.mod
< prev
next >
Wrap
Text File
|
1993-08-15
|
7KB
|
220 lines
(***************************************************************************
:Program. DoubleBuffering.mod
:Author. Jürgen Zimmermann
:Address. Ringstraße 6, 6719 Altleiningen, West-Germany
:Phone. 06356/1456
:ShortCut. [JnZ]
:Support. -
:Version. 1.0
:Date. 28. October 1989
:Copyright. PD
:Language. MODULA-II
:Translator. M2Amiga 3.3d
:Contents. Modul zur einfachen Handhabung von DoubleBuffering-Views
:Contents. zur flimmerfreien Darstellung bewegter Grafik
:Remark. Ich würde mich sehr über Kontakt mit anderen M2Amiga-Usern
:Remark. und MIDI-Freaks freuen.
:Usage. Siehe "DoubleBuffering.dok"
****************************************************************************)
IMPLEMENTATION MODULE DoubleBuffering;
FROM SYSTEM IMPORT ADR, ADDRESS;
FROM Graphics IMPORT SetAPen, SetDrMd, RectFill, jam1, Move, DrawModes,
DrawModeSet, ViewModeSet, ViewModes, RastPort,
RastPortPtr, GfxBase, GfxBasePtr, View, ViewPtr,
ViewPort,ViewPortPtr,AllocRaster, MrgCop,MakeVPort,
InitBitMap, LoadView, InitRastPort, WaitTOF, GetColorMap,
FreeColorMap,FreeRaster,FreeVPortCopLists,FreeCprList,
BitMap, BitMapPtr, RasInfo, CprlistPtr, Cprlist,
InitVPort, InitView;
FROM Arts IMPORT Assert;
IMPORT Graphics;
VAR (* Variable für den View!!! *)
DualBitMap : ARRAY[0..1] OF BitMap;
DualRastPort : ARRAY[0..1] OF RastPort;
DualVPort : ViewPort;
DualView : View;
DualOldViewPtr : ViewPtr;
DualRasInfo : RasInfo;
DualCListPtr : ARRAY[0..1] OF CprlistPtr;
(* Copperlisten für noninterlace *)
DualSListPtr : ARRAY[0..1] OF CprlistPtr;
(* Copperlisten für interlace *)
GraphicsLibraryPtr: GfxBasePtr;
VAR (* Variable, die global verändert werden müssen *)
AtTheMoment : [0..2];
DualDepth : INTEGER; (* Anzahl der Planes pro BitMap *)
DualWidth, DualHeight: INTEGER;
AllreadyUsed : BOOLEAN;
PROCEDURE GetDoubleViewPort(): ViewPortPtr;
BEGIN
RETURN (ADR(DualVPort));
END GetDoubleViewPort;
PROCEDURE GetDrawRastPort(): RastPortPtr;
BEGIN
RETURN (ADR(DualRastPort[AtTheMoment]));
END GetDrawRastPort;
PROCEDURE CleanDrawBuffer;
VAR Raster: RastPortPtr;
BEGIN
Raster:=GetDrawRastPort();
SetAPen(Raster, 0);
SetDrMd(Raster, jam1);
RectFill(Raster, 0, 0, (DualWidth-1), (DualHeight-1));
END CleanDrawBuffer;
PROCEDURE SwapBuffers;
BEGIN
DualView.lofCprList:=DualCListPtr[AtTheMoment]; (* Copperlisten *)
DualView.shfCprList:=DualSListPtr[AtTheMoment]; (* austauschen *)
LoadView(ADR(DualView)); (* Bitplane auf Bildschirm bringen *)
WaitTOF; (* und auf Rasterstrahl warten (verhindert 'flimmern') *)
AtTheMoment:=(AtTheMoment+1) MOD 2;(* Umschalten auf andere Bitplane zum
'verdeckten' zeichnen. *)
END SwapBuffers;
PROCEDURE OpenDoubleView(leftEdge,topEdge: INTEGER;
width, height : INTEGER;
depth : INTEGER;
viewModes : ViewModeSet);
VAR Bitmaps, Bitplanes: INTEGER;
NumberOfColors : INTEGER;
BEGIN
Assert(NOT(AllreadyUsed),
ADR("You can open only one DoubleView at the same time!"));
NumberOfColors:=0;
DualDepth :=(depth-1);
DualWidth :=width;
DualHeight :=height;
DualOldViewPtr:=GraphicsLibraryPtr^.actiView; (* alten View retten für
Programmende *)
Assert((DualOldViewPtr#NIL),ADR("There's no old View to return to!"));
AllreadyUsed:=TRUE;
InitView(DualView);
InitVPort(DualVPort);
FOR Bitmaps:=0 TO 1 DO
InitRastPort(DualRastPort[Bitmaps]);
InitBitMap(DualBitMap[Bitmaps], depth, width, height);
FOR Bitplanes:=0 TO DualDepth DO
INC (NumberOfColors,1); (* Anzahl der Farben pro Bitplane um 2
erhöhen => pro Bitmap um 1 erhöhen. *)
DualBitMap[Bitmaps].planes[Bitplanes]:=AllocRaster (width, height);
Assert((DualBitMap[Bitmaps].planes[Bitplanes]#NIL),
ADR("Error while allocating memory for bitplanes"));
END; (* FOR *)
DualRastPort[Bitmaps].bitMap:=ADR(DualBitMap[Bitmaps]);
END; (* FOR *)
WITH DualView DO
viewPort:=ADR(DualVPort);
modes :=viewModes;
END; (* WITH *)
WITH DualVPort DO
dWidth :=width;
dHeight :=height;
rasInfo :=ADR(DualRasInfo);
colorMap:=GetColorMap(NumberOfColors);
END; (* WITH *)
WITH DualRasInfo DO
rxOffset:=leftEdge;
ryOffset:=topEdge;
next :=NIL;
END; (* WITH *)
FOR Bitmaps:=0 TO 1 DO
DualView.lofCprList:=NIL; (* Betriebssystem in die Irre führen: *)
DualView.shfCprList:=NIL; (* "Es sind noch keine Copperlisten
vorhanden!" *)
DualRasInfo.bitMap:=ADR(DualBitMap[Bitmaps]);
MakeVPort(ADR(DualView),ADR(DualVPort));
MrgCop(ADR(DualView));
DualCListPtr[Bitmaps]:=DualView.lofCprList;
DualSListPtr[Bitmaps]:=DualView.shfCprList;
END; (* FOR *)
AtTheMoment:=1; (* Buffer2 ist aktuell *)
CleanDrawBuffer; (* Buffer2 löschen *)
SwapBuffers; (* und auf dem Bildschirm darstellen *)
END OpenDoubleView;
PROCEDURE CloseDoubleView;
VAR Bitmaps, Bitplanes: INTEGER;
BEGIN
IF (DualOldViewPtr # NIL)
THEN
LoadView(DualOldViewPtr);
WaitTOF; (* Warten, bis alter View erscheint *)
END; (* IF *)
(* ab hier werden die allozierten Speicher wieder freigegeben *)
FreeVPortCopLists(ADR(DualVPort));
IF (DualVPort.colorMap # NIL)
THEN
FreeColorMap(DualVPort.colorMap);
END; (* IF *)
FOR Bitmaps:=0 TO 1 DO
FreeCprList(DualCListPtr[Bitmaps]);
FreeCprList(DualSListPtr[Bitmaps]);
FOR Bitplanes:=0 TO DualDepth DO
IF (DualBitMap[Bitmaps].planes[Bitplanes] # NIL)
THEN
FreeRaster(DualBitMap[Bitmaps].planes[Bitplanes],
DualWidth,DualHeight);
END; (* IF *)
END; (* FOR *)
END; (* FOR *)
AllreadyUsed:=FALSE;
END CloseDoubleView;
BEGIN
GraphicsLibraryPtr:=ADR(Graphics); (* Adresse der "graphics.library" holen *)
AllreadyUsed :=FALSE;
END DoubleBuffering.